#ifndef OPERAND_H
#define OPERAND_H
#include <cstdint>
#include <vector>
#include "ring_poly.h"
#include "context.h"
#include "prng.h"

class Ciphertext;
class Plaintext;
/* *
 * @class Operand
 * @brief 同态加密中的操作数类，作为Ciphertext和Plaintext的基类。
 *
 * `Operand` 类是 `Ciphertext` 和 `Plaintext` 的基类，定义了加密计算中的操作数所需的基本接口。
 * 所有加密对象必须继承此类，并实现其虚拟函数。
 */
class Operand {
public:
    MultiType type;

    Operand(MultiType type) : type(type) {}
    virtual Ciphertext *El() = 0;
    virtual int Degree() = 0;
    virtual int Level() = 0;
    virtual int CoeffCount() = 0;
    virtual ~Operand() {}
};
/* *
 * @class Ciphertext
 * @brief 密文类，表示同态加密中的密文。
 *
 * `Ciphertext` 类继承自 `Operand`
 * 类，表示同态加密中的密文对象，提供密文的基本操作，如复制、获取密文的多项式度数、层级等。
 */
class Ciphertext : public Operand {
public:
    std::vector<Poly *> value;

    Ciphertext(Context *parameters, int degree, int level);
    Ciphertext(uint64_t N, int degree, int level);
    Ciphertext();
    // 重载赋值运算符
    Ciphertext &operator = (const Ciphertext &other);

    Ciphertext(Plaintext plaintext);
    Ciphertext *El() override;
    int Degree() override;
    int Level() override;
    int CoeffCount() override;
    void Copy(Ciphertext *ctxCopy);
};
/* *
 * @class Plaintext
 * @brief 明文类，表示同态加密中的明文。
 *
 * `Plaintext` 类继承自 `Operand` 类，表示同态加密中的明文对象，提供明文的基本操作，如获取明文的多项式度数、层级等。
 */
class Plaintext : public Operand {
public:
    Poly *value;

    Plaintext();
    Plaintext(Context *parameters, int level);
    Plaintext(uint64_t N, int level);
    Plaintext(std::vector<uint64_t> in, int level);

    Ciphertext *El() override;
    int Degree() override;
    int Level() override;
    int CoeffCount() override;
};

typedef Plaintext PlaintextRingT;
typedef Plaintext PlaintextMul;

#endif // OPERAND_H